home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Miscellaneous / Headlines Code / Jamie’s PD Code ƒ / JRandom.c < prev    next >
Text File  |  1992-06-20  |  2KB  |  80 lines

  1. /*
  2.  * JRandom.c
  3.  *
  4.  * "JamieRandom": A hacked-up non-OOP version of version 1.1.1 of CRandom.
  5.  * CRandom is available by ftp from ftp.brown.edu in /pub/tcl/classes.
  6.  *
  7.  * JRandom.c and JRandom.h are in the public domain.
  8.  *
  9.  */
  10.  
  11.  
  12.  
  13. /******************************/
  14.  
  15. #include "JRandom.h"
  16.  
  17. /******************************/
  18.  
  19. #include <Global.h>
  20.  
  21. /******************************/
  22.  
  23. #define MULTIPLICAND (4096)
  24. #define MULTIPLY(x) ((x) << 12)
  25.  
  26. #define ADDEND (150889)
  27. #define ADD(x) ((x) + ADDEND)
  28.  
  29.     /* this probably isn't really a word, but what the hell */
  30. #define MODULEND (NDISTINCTRANDOMVALUES)
  31. #define MODULO(x) ((x) % MODULEND)
  32.  
  33. #define NEXTVAL(x) (MODULO(ADD(MULTIPLY(x))))
  34.  
  35. /******************************/
  36.  
  37.  
  38.  
  39. void IJRandom(jrPtr theJRPtr)
  40. {
  41.     unsigned long theDateTime;
  42.     GetDateTime(&theDateTime);
  43.     jrSeed(theJRPtr, theDateTime ^ TickCount());
  44. }
  45.  
  46.  
  47.  
  48. void jrSeed(register jrPtr theJRPtr,
  49.     unsigned long seedVal)
  50. {
  51.     register short j;
  52.     
  53.     theJRPtr->dummy = MODULO(Abs(ADDEND - seedVal));
  54.     for (j = NRANDOMSLOTS-1; j >= 0; j--) {
  55.         theJRPtr->seeds[j] = theJRPtr->dummy = NEXTVAL(theJRPtr->dummy);
  56.     }
  57.     theJRPtr->value = theJRPtr->dummy = NEXTVAL(theJRPtr->dummy);
  58. }
  59.  
  60.  
  61.  
  62. short jrLinearShort(register jrPtr theJRPtr,
  63.     register short lowest, short highest)
  64. {
  65.     register long interval = highest - lowest + 1;
  66.     register long partitionSize;
  67.     register short j;
  68.     
  69.     if (interval <= 0) return lowest;
  70.     partitionSize = (NDISTINCTRANDOMVALUES-1)/interval;
  71.     while (TRUE) {
  72.         j = (NRANDOMSLOTS*theJRPtr->value) / NDISTINCTRANDOMVALUES;
  73.         theJRPtr->value = theJRPtr->seeds[j];
  74.         theJRPtr->seeds[j] = theJRPtr->dummy = NEXTVAL(theJRPtr->dummy);
  75.         if (theJRPtr->value < partitionSize * interval) {
  76.             return lowest + theJRPtr->value/partitionSize;
  77.         }
  78.     }
  79. }
  80.